package reflection;

import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author 王艺锡
 * @version 1.0
 */
@SuppressWarnings({"all"})
public class ReflectionIntroduce {
    public static void main(String[] args) throws Exception{
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();

        //反射
        //1.加载类，返回一个Class对象
        Class cls = Class.forName(classfullpath);

        //2.通过cls得到你要加载的类的对象实例
        //Object o = cls.getDeclaredConstructor().newInstance();
        Object o = cls.newInstance();
        System.out.println(o.getClass());//Cat
        //3.通过cls得到你要调用的方法的对象
        //在反射中，可以把方法视为对象
        Method method = cls.getMethod(methodName);//配置文件中methodName是什么方法名，此时调用的就是什么方法
        //4.通过method对象调用方法
        method.invoke(o);

        //5.Filed对象表示某个类的成员变量
        Field age = cls.getField("age");
        System.out.println(age.get(o));//反射中写法:成员变量对象.get(对象)

        //6.constructor对象表示构造器
        Constructor constructor = cls.getConstructor();
        System.out.println(constructor);//无参构造器

        Constructor constructor1 = cls.getConstructor(String.class);
        System.out.println(constructor1);//带参构造器

        Constructor constructor2 = cls.getConstructor(String.class, int.class);
        System.out.println(constructor2);
    }

}
